﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace DynaSpace.Menu
{
	/// <summary>
	/// Třída reprezentující seznam <see cref="MenuContainer">menu containerů</see>
	/// </summary>
	public class MenuContainerCollection
	{
		private LinkedList<MenuContainer> items = new LinkedList<MenuContainer>();
		bool menuFocus = false;

		/// <summary>
		/// Konstruktor <see cref="MenuContainerCollection"/>
		/// </summary>
		public MenuContainerCollection()
		{
			
		}

		/// <summary>
		/// Vrací seznam <see cref="MenuContainer">menu containerů</see>
		/// </summary>
		public LinkedList<MenuContainer> Items
		{
			get
			{
				return items;
			}
		}

		/// <summary>
		/// Vrací, zda má některé z menu focus (tedy, zda nemá focus hlavní herní plocha)
		/// </summary>
		public bool MenuFocus
		{
			get
			{
				return menuFocus;
			}
		}

		/// <summary>
		/// Updatuje stavy prvků ve všech obsažených aktivních menu
		/// </summary>
		/// <param name="gameTime">Herní čas</param>
		public void Update(GameTime gameTime)
		{
			// vyhledat menu, ktere jsou viditelne
			MenuContainer[] visibleItems = items.Where(mc => mc.Visible == true).ToArray();

			// najdeme poslední menu, které může mít index
			int lastCanHaveFocusIndex = -1;

			for (int i = 0; i < visibleItems.Length; i++)
			{
				if (visibleItems[i].CanHaveFocus)
					lastCanHaveFocusIndex = i;
			}

			// projit je a updatovat, u posledniho z nich urcit, ze ma focus
			for (int i = 0; i < visibleItems.Length; i++)
			{
				visibleItems[i].Update(gameTime, i == lastCanHaveFocusIndex);
			}
			
			// pokud existuje alespoň jedno viditelné menu, které může získat focus, bude menuFocus = true
			menuFocus = lastCanHaveFocusIndex != -1;
		}

		/// <summary>
		/// Vykreslí všechny viditelné položky ve viditelných menu
		/// </summary>
		/// <param name="spriteBatch"></param>
		public void Draw(SpriteBatch spriteBatch)
		{
			foreach (MenuContainer mc in items)
			{
				if (mc.Visible)
				{
					mc.Draw(spriteBatch);
				}
			}
		}
	}
}
